package com.xiaoYuan;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.LinkedList;
import java.util.Scanner;

/**
 * 密码工具类
 */
public class PassWordToll {

    /**
     * 创建黑窗口页面
     */
    public static void page(){
        System.out.println("------密码管理系统-------\n" +
                "|1. 查询已有密码\t|\n" +
                "|2. 添加更多密码\t|\n" +
                "|3. 删除已有密码\t|\n" +
                "|4. 查看已存密码\t|\n" +
                "|5. 修改登录密码\t|\n" +
                "|6. 退出管理程序\t|\n" +
                "-------------------------");
    }

    /**
     * 写出密码集合到本地
     * @param outSite 写出地址
     * @param linkedList 密码集合
     * @return 成功返回true 失败返回false
     */
    public static boolean writePassWord(String outSite, LinkedList<PassWord> linkedList) {
        ObjectOutputStream objOut = null;
        try {
            objOut = new ObjectOutputStream(new FileOutputStream(outSite));

            objOut.writeObject(linkedList);
            objOut.flush();
            return true;

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(objOut != null){
                try {
                    objOut.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return false;
    }

    /**
     * 查询密码
     * @param lookPassWord 查询密码的备注
     * @param linkedList 密码集合
     * @return 成功返回该对象，失败返回null
     */
    public static PassWord findPassWord(String lookPassWord, LinkedList<PassWord> linkedList) {

        for (PassWord obj : linkedList) {
            if (lookPassWord.equals(obj.getName())) {
                return obj;
            }
        }
        return null;
    }

    /**
     * 加载密码对象到集合中
     * @param loadSite 加载对象地址
     * @param linkedList 集合
     * @return 返回加载后的集合
     */
    public static LinkedList<PassWord> passWordObjectLoad(String loadSite, LinkedList<PassWord> linkedList) {
        ObjectInputStream objIn = null;
        try {
            // 尝试执行加载密码集合 成功后返回密码集合
            objIn = new ObjectInputStream(new FileInputStream(loadSite));
            linkedList = (LinkedList<PassWord>) objIn.readObject();
            return linkedList;

        } catch (IOException | ClassNotFoundException e) {
            // 出现异常，在本地创建密码集合文件，并且重写加载密码集合
            PassWordToll.writePassWord(loadSite, linkedList);
            PassWordToll.passWordObjectLoad(loadSite, linkedList);
        } finally {
            if (objIn != null) {
                try {
                    objIn.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return linkedList;
    }

    /**
     * 删除集合中的密码
     * @param delPassWord 删除的密码对象
     * @param linkedList 密码集合
     * @return 删除成功返回true 删除失败返回false
     */
    public static boolean delPassWord(String delPassWord, LinkedList<PassWord> linkedList){
        for(PassWord passWord : linkedList){
            if(delPassWord.equals(passWord.getName())){
                linkedList.remove(passWord);
                return true;
            }
        }
        return false;
    }

    /**
     * 判断app的密码
     * @param loadSite 登录密码保存地址
     * @param s 输入
     * @return 如果密码存在，返回密码，如果不存在创建密码，并且返回密码设置成功
     */
    public static String getPassWord(String loadSite, Scanner s){
        FileInputStream fileInputStream = null;
        try {
            // 如果密码存在执行读取密码
            fileInputStream = new FileInputStream(loadSite);
            byte[] readByte = new byte[1024];
            int length;
            length = fileInputStream.read(readByte);

            return new String(readByte, 0, length);
        } catch (FileNotFoundException e) {
            // 如果密码不存在重写写出密码
            System.out.print("第一次使用，请输入登录密码：");
            if(PassWordToll.setPassWord(loadSite,s.next())){
                return "密码设置成功！";
            }
            return "密码设置失败！";
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileInputStream != null){
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return "密码设置成功！";
    }

    /**
     * 设置并且写出密码
     * @param loadSite 写出密码的地址
     * @param setAppPassWord 需要写出的密码
     * @return 如果成功返回true 失败返回false
     */
    public static boolean setPassWord(String loadSite, String setAppPassWord){
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(loadSite);
            fileOutputStream.write(setAppPassWord.getBytes(StandardCharsets.UTF_8));
            fileOutputStream.flush();
            return true;
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if(fileOutputStream != null){
                try {
                    fileOutputStream.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        }
        return false;
    }
}


